class Carro
	attr_reader :marca, :modelo, :tanque;
	def initialize(marca, modelo, tanque)
		@marca = marca;
		@modelo = modelo;
		@tanque_capacidade = tanque;
		@tanque = tanque;
	end
	def enche_tanque(litros)
		@tanque = @tanque + litros;
		@tanque = @tanque_capacidade if @tanque > @tanque_capacidade;
	end
	def anda(km)
		litros_gastos = km/4;
		if litros_gastos > @tanque
			@tanque = 0;
			return "Tanque vazio, favor encher";
		end
		@tanque = @tanque - litros_gastos;
		#fator de 4km por litro, aleatorio
	end
	def to_s
		return "Marca:"+@marca+" Modelo:"+@modelo;
	end
end

class Montadora
	attr_reader :marca, :carros_produzidos;
	@@carros_no_mundo = 0;
	def initialize(marca)
		@marca = marca;
		@tanque_padrao = 1000;
		@carros_produzidos = 0;
	end
	def monta_carro(modelo, tanque=@tanque_padrao)
		carro = Carro::new(@marca, modelo, tanque);
		@carros_produzidos += 1;
		@@carros_no_mundo += 1;
		return carro
	end
	def method_missing(method)
		method = method.to_s;
		if method.include? "monta_"
			modelo = method.gsub(/monta_/, "");
			return monta_carro(modelo);
		end
	end
	def self.carros_no_mundo
		return @@carros_no_mundo;
	end
end

class Garagem
	attr_reader :carros;
	def initialize(*carros)
		@carros = [];
		if carros.length > 0
			insere_carros carros;
		end
	end
	def insere_carro(carro)
		@carros.push carro;
	end
	def <<(carro)
		insere_carro(carro);
	end
	def insere_carros(*carros)
		if carros.length > 0
			carros.each do |carro|
				insere_carro carro;
			end
		end
		return @carros;
	end
	def carros_por_modelo(modelo)
		carros = @carros.find_all {|carro| carro.modelo == modelo}
		@carros = @carros - carros;
		return (carros.length == 1) ? carros[0] : carros;
	end
	def to_s
		string = "Carros: "
		@carros.each do |carro|
			string += "["+carro.to_s+"] ";
		end
		return string;
	end
	def total
		return @carros.length
	end
end

volks = Montadora::new "Volksvagem";
garagem = Garagem::new;
gol = volks.monta_Gol;
garagem << gol;
garagem << volks.monta_carro("Golf", 3000);
golf = garagem.carros_por_modelo("Golf");
puts golf.tanque;
golf.anda(30000);
puts golf.tanque;
golf.enche_tanque(7500)
puts golf.tanque;
puts garagem.to_s+"\nNumero de Carros: "+garagem.total.to_s;






